﻿package utils.appli.views {
	
	import utils.appli.events.ModelePlateauEvent;
	import utils.appli.events.DeEvent;
	import utils.appli.ModelePlateau;
	import utils.appli.Case;
	import utils.appli.Couleur;
	import utils.appli.ControleurActions;
	import utils.ihm.ChevalIHM;
	import utils.ihm.DeIHM;
	import flash.events.MouseEvent;
	import flash.display.Sprite;
	import flash.display.DisplayObject;
	
	public class PlateauManager extends Sprite{
		
		private var _modele:ModelePlateau;
		private var _controleur:ControleurActions;
		private var _deIHM:DeIHM;
		
		//Il faut que les 2 int soit à -1 pour déplacer le cheval.
		private var _caseDestinationNumber:int = -1;
		private var _caseChevalSelectionneNumber:int = -1;

		public function PlateauManager() {
			this._modele = ModelePlateau.getInstance();
			this._controleur = new ControleurActions();
			_deIHM = new DeIHM();
			
			
			//Ajout de toutes les cases sur le plateau
			//ligne rond bleu horizontaux
			//ligne rond bleu horizontaux
			addChild(new Case(25, 340, Couleur._ROUGE, true));
			addChild(new Case(77.5, 340, Couleur._ROUGE, false));
			addChild(new Case(130, 340, Couleur._ROUGE, false));
			addChild(new Case(182.5, 340, Couleur._ROUGE, false));
			addChild(new Case(235, 340, Couleur._ROUGE, false));
			addChild(new Case(287.5, 340, Couleur._ROUGE, false));
			addChild(new Case(340, 340, Couleur._ROUGE, false));
			//ligne rond bleu verticaux
			addChild(new Case(340, 287.5, Couleur._ROUGE, false));
			addChild(new Case(340, 235, Couleur._ROUGE, false));
			addChild(new Case(340, 182.5, Couleur._ROUGE, false));
			addChild(new Case(340, 130, Couleur._ROUGE, false));
			addChild(new Case(340, 77.5, Couleur._ROUGE, false));
			addChild(new Case(340, 25, Couleur._ROUGE, false));
			//dernier rond bleu
			addChild(new Case(400, 25, Couleur._ROUGE, false));

			//##############################################

			//ligne rond rouge verticaux
			addChild(new Case(460, 25, Couleur._VERT, true));
			addChild(new Case(460, 77.5, Couleur._VERT, false));
			addChild(new Case(460, 130, Couleur._VERT, false));
			addChild(new Case(460, 182.5, Couleur._VERT, false));
			addChild(new Case(460, 235, Couleur._VERT, false));
			addChild(new Case(460, 287.5, Couleur._VERT, false));
			addChild(new Case(460, 340, Couleur._VERT, false));
			//ligne rond rouge horizontaux
			addChild(new Case(512.5, 340, Couleur._VERT, false));
			addChild(new Case(565, 340, Couleur._VERT, false));
			addChild(new Case(617.5, 340, Couleur._VERT, false));
			addChild(new Case(670, 340, Couleur._VERT, false));
			addChild(new Case(722.5, 340, Couleur._VERT, false));
			addChild(new Case(775, 340, Couleur._VERT, false));
			//dernier rond rouge
			addChild(new Case(775, 400, Couleur._VERT, false));

			//##############################################

			//ligne rond jaune horizontaux
			addChild(new Case(775, 460, Couleur._JAUNE, true));
			addChild(new Case(722.5, 460, Couleur._JAUNE, false));
			addChild(new Case(670, 460, Couleur._JAUNE, false));
			addChild(new Case(617.5, 460, Couleur._JAUNE, false));
			addChild(new Case(565, 460, Couleur._JAUNE, false));
			addChild(new Case(512.5, 460, Couleur._JAUNE, false));
			addChild(new Case(460, 460, Couleur._JAUNE, false));
			//ligne rond jaune verticaux
			addChild(new Case(460, 512.5, Couleur._JAUNE, false));
			addChild(new Case(460, 565, Couleur._JAUNE, false));
			addChild(new Case(460, 617.5, Couleur._JAUNE, false));
			addChild(new Case(460, 670, Couleur._JAUNE, false));
			addChild(new Case(460, 722.5, Couleur._JAUNE, false));
			addChild(new Case(460, 775, Couleur._JAUNE, false));
			//dernier rond jaune
			addChild(new Case(400, 775, Couleur._JAUNE, false));

			//ligne rond vert verticaux
			addChild(new Case(340, 775, Couleur._BLEU, true));
			addChild(new Case(340, 722.5, Couleur._BLEU, false));
			addChild(new Case(340, 670, Couleur._BLEU, false));
			addChild(new Case(340, 617.5, Couleur._BLEU, false));
			addChild(new Case(340, 565, Couleur._BLEU, false));
			addChild(new Case(340, 512.5, Couleur._BLEU, false));
			addChild(new Case(340, 460, Couleur._BLEU, false));
			//ligne rond vert horizontaux
			addChild(new Case(287.5, 460, Couleur._BLEU, false));
			addChild(new Case(235, 460, Couleur._BLEU, false));
			addChild(new Case(182.5, 460, Couleur._BLEU, false));
			addChild(new Case(130, 460, Couleur._BLEU, false));
			addChild(new Case(77.5, 460, Couleur._BLEU, false));
			addChild(new Case(25, 460, Couleur._BLEU, false));
			//dernier rond vert
			addChild(new Case(25, 400, Couleur._BLEU, false));



			//ligne carre bleu numéroté horizontaux
			addChild(new Case(77.5, 400, Couleur._ROUGE, true));
			addChild(new Case(130, 400, Couleur._ROUGE, true));
			addChild(new Case(182.5, 400, Couleur._ROUGE, true));
			addChild(new Case(235, 400, Couleur._ROUGE, true));
			addChild(new Case(287.5, 400, Couleur._ROUGE, true));
			addChild(new Case(340, 400, Couleur._ROUGE, true));

			//ligne carre rouge numéroté verticaux
			addChild(new Case(400, 77.5, Couleur._VERT, true));
			addChild(new Case(400, 130, Couleur._VERT, true));
			addChild(new Case(400, 182.5, Couleur._VERT, true));
			addChild(new Case(400, 235, Couleur._VERT, true));
			addChild(new Case(400, 287.5, Couleur._VERT, true));
			addChild(new Case(400, 340, Couleur._VERT, true));
			//ligne carre jaune numéroté horizontaux
			addChild(new Case(722.5, 400, Couleur._JAUNE, true));
			addChild(new Case(670, 400, Couleur._JAUNE, true));
			addChild(new Case(617.5, 400, Couleur._JAUNE, true));
			addChild(new Case(565, 400, Couleur._JAUNE, true));
			addChild(new Case(512.5, 400, Couleur._JAUNE, true));
			addChild(new Case(460, 400, Couleur._JAUNE, true));
			//ligne carre vert numéroté verticaux
			addChild(new Case(400, 722.5, Couleur._BLEU, true));
			addChild(new Case(400, 670, Couleur._BLEU, true));
			addChild(new Case(400, 617.5, Couleur._BLEU, true));
			addChild(new Case(400, 565, Couleur._BLEU, true));
			addChild(new Case(400, 512.5, Couleur._BLEU, true));
			addChild(new Case(400, 460, Couleur._BLEU, true));

			//ajout des cases de départ dans les ecuries
			addChild(new Case(100, 100, Couleur._ROUGE, false));
			addChild(new Case(200, 200, Couleur._ROUGE, false));
			addChild(new Case(100, 200, Couleur._ROUGE, false));
			addChild(new Case(200, 100, Couleur._ROUGE, false));
			addChild(new Case(100, 600, Couleur._BLEU, false));
			addChild(new Case(200, 700, Couleur._BLEU, false));
			addChild(new Case(100, 700, Couleur._BLEU, false));
			addChild(new Case(200, 600, Couleur._BLEU, false));
			addChild(new Case(600, 100, Couleur._VERT, false));
			addChild(new Case(700, 200, Couleur._VERT, false));
			addChild(new Case(600, 200, Couleur._VERT, false));
			addChild(new Case(700, 100, Couleur._VERT, false));
			addChild(new Case(600, 600, Couleur._JAUNE, false));
			addChild(new Case(700, 700, Couleur._JAUNE, false));
			addChild(new Case(600, 700, Couleur._JAUNE, false));
			addChild(new Case(700, 600, Couleur._JAUNE, false));	
			
			addChild(_deIHM);
			
			this.configurer();
		}
		
		//////////////
		//////////////
		
		public function configurer():void {
			//ecoutes cases
			for(var i=0; i < this.numChildren; i++){
    			this.getChildAt(i).addEventListener(MouseEvent.CLICK, caseDestinationSelectionne);
			}
			
			//ecoutes modele
			this._modele.addEventListener(ModelePlateauEvent.CASE_OCCUPEE, ecouterModele);
			this._modele.addEventListener(ModelePlateauEvent.CASE_VIDEE, ecouterModele);
			
			//ecouteurs du de
			this._deIHM.addEventListener(MouseEvent.CLICK, deIHMClique);
		}
		
		private function ecouterModele(pEvt:ModelePlateauEvent):void {
			switch(pEvt.type){
				case ModelePlateauEvent.CASE_OCCUPEE:
					this.occuper(pEvt.numCase);
					break;
				case ModelePlateauEvent.CASE_VIDEE:
					this.vider(pEvt.numCase);
					break;
				default :
					trace("événement non géré!");
			}
		}
		
		/*private function ecouterDeIHM(pEvt:DeEvent):void {
			switch(pEvt.type){
				case DeEvent.DE_LANCE:
					this._controleur.de.lancerDe();
					break;
				default :
					trace("événement non géré!");
			}
		}*/
		
		private function deIHMClique(pEvt:MouseEvent):void {
			this._controleur.de.addEventListener(DeEvent.DE_LANCE, actualiserDeIHM);
			this._controleur.actionApresLanceDe();
		}
		
		//////////////
		//////////////
		
		public function occuper(aNumCase:int){
			var couleurCheval:uint = this._modele._parcoursArray[aNumCase]._couleur;
			var aChevalIHM:ChevalIHM = new ChevalIHM(couleurCheval);
			var maCase:Case = this.getChildAt(aNumCase) as Case;
			maCase.occuper(new ChevalIHM(couleurCheval));
			// ajout écouteur sélection par clic
			aChevalIHM.addEventListener(MouseEvent.CLICK, chevalSelectionne);
		}
		
		public function vider(aNumCase:int){
			var maCase:Case = this.getChildAt(aNumCase) as Case;
			maCase.inoccuper();
		}
		
		//////////////
		//////////////
		
		public function chevalSelectionne(pEvt:MouseEvent){
			_caseChevalSelectionneNumber = this.getChildIndex(pEvt.currentTarget as DisplayObject);
			verifDeplacement();
		}
		
		public function caseDestinationSelectionne(pEvt:MouseEvent){
			_caseDestinationNumber = this.getChildIndex(pEvt.currentTarget as DisplayObject);
			verifDeplacement();
		}
		
		public function verifDeplacement(){
			if ((_caseChevalSelectionneNumber != -1) && (_caseDestinationNumber != -1) && 
				(_caseChevalSelectionneNumber != _caseDestinationNumber)){
				// TODO : trouver un moyen de deplacer le cheval
				//this._controleur.deplacerCheval()
				
				_caseChevalSelectionneNumber != -1;
				_caseDestinationNumber != -1;
			}
		}
		
		//////////////
		//////////////
		
		public function actualiserDeIHM(pEvt:DeEvent){
			this._deIHM.actualiserValeur(pEvt.valeurDe);
		}
		
		
		/*public function get somme():TextField{
			return this._somme;
		}*/
	}
}